package com.medusa.aps.business.modules.basic.mp.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.medusa.aps.business.model.pagination.Page;
import com.medusa.aps.business.modules.basic.model.input.ClassSystemEquipmentPageParam;
import com.medusa.aps.business.modules.basic.model.input.ClassSystemParam;
import com.medusa.aps.business.modules.basic.model.output.ClassSystemEquipmentModel;
import com.medusa.aps.business.modules.basic.model.output.ClassSystemListModel;
import com.medusa.aps.business.modules.basic.model.output.ClassSystemModel;
import com.medusa.aps.business.modules.basic.mp.entity.ClassSystem;
import com.medusa.aps.business.modules.basic.mp.entity.WorkingCalendar;
import com.medusa.aps.business.modules.basic.mp.entity.WorkingPeriod;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 班制服务接口
 *
 * @author yuxh
 * @since 2023-08-14 17:37:43
 */
public interface ClassSystemService extends IService<ClassSystem> {

    /**
     * 分页查询班制配置
     *
     * @param queryPage 分页查询参数
     * @return 分页查询结果
     */
    IPage<ClassSystemListModel> classPage(Page<ClassSystem> queryPage);

    /**
     * 新增班制配置
     *
     * @param classSystemPram 班制参数
     */
    void newClass(ClassSystemParam classSystemPram);

    /**
     * 修改班制配置
     *
     * @param classSystem 班制配置参数
     */
    void updateClass(ClassSystemParam classSystem);

    List<WorkingCalendar> renderCalendar(Integer classId, LocalDate currentDate, ClassSystemParam classSystemParam, Map<Integer, WorkingPeriod> workingPeriodMap);

    /**
     * 删除班制配置
     *
     * @param id 班制配置id
     */
    void removeClass(Integer id);

    /**
     * 分页查询设备
     *
     * @param queryPage 分页查询参数
     * @return 分页查询结果
     */
    IPage<ClassSystemEquipmentModel> equipmentPage(ClassSystemEquipmentPageParam queryPage);

    /**
     * 班制详情
     *
     * @param id 班制id
     * @return 班制详情
     */
    ClassSystemModel classInfo(Integer id);

    Boolean isGenerateWorkingCalendar();

    void handlerNewClass(ClassSystem classSystem, ClassSystemParam classSystemParam, Map<Integer, WorkingPeriod> workingPeriodMap);

    void handlerUpdateClass(ClassSystemParam classSystemParam, ClassSystem classSystem);
     void handlerDelClassSystem(Integer id, Set<Long> deviceIds);
}

